//
//  SQLiteDataBaseManager.m
//  18---SQLite
//
//  Created by 冀永金 on 16/8/8.
//  Copyright © 2016年 冀永金. All rights reserved.
//

#import "SQLiteDataBaseManager.h"
#import "Student.h"
@implementation SQLiteDataBaseManager
// 单例创建方式，只有一个对象
//******** 内存管理中，单例不能被释放
+(SQLiteDataBaseManager *)shareManager {
    static SQLiteDataBaseManager *manager = nil;
    // 保证线程安全只执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[SQLiteDataBaseManager alloc]init];
    });
    
    return manager;
}

- (BOOL)openSQLite3 {
    // 数据库SQLite文件类型.sqlite
   NSString *dbpath =  [[NSSearchPathForDirectoriesInDomains(  NSDocumentDirectory, NSUserDomainMask, YES) firstObject]stringByAppendingPathComponent:@"student.sqlite"];
    NSLog(@"%@",dbpath);
   // BOOL isOpen = YES;
    // UTF8String 属性，将OC字符串转换成C语言字符创
    // 参数一：数库文件路径
    // 参数二：指向指针的指针  该指针可以被修改 数据库管理指针
     int result = sqlite3_open(dbpath.UTF8String, &dbPoint);
    // sqlite3_open 当路径文件不存在时，文件会被SQLite创建并且打开
    // 当路径文件存在时，文件被直接打开
    // 返回值为int型， 0  SQLITE_OK代表成功   1代表失败
//    if (result == SQLITE_OK) {
//        NSLog(@"数据库打开成功");
//        isOpen = YES;
//    }else {
//        NSLog(@"数据库打开失败 ,code:%d",result);
//        isOpen =NO;
//    }
//    return isOpen;
    //result [self isOperationResult:result alertText:@"打开数据库"];
    return [self isOperationResult:result alertText:@"打开数据库"];
}

- (BOOL)closeSQLite3 {
    // 关闭数据库时，如果数据库处于打开状态，则正常关闭，显示成功
    //如果数据库处于关闭状态，则不能正常关闭，显示失败 code :21
 int result = sqlite3_close(dbPoint);
  return [self isOperationResult:result alertText:@"关闭数据库"];
}

- (BOOL)createTable {
    // SQL语句创建
    // 创建表格
    // create table 表名 （字段1 类型  约束，字段2，字段3）；
    // primary key 一个表，有且只有一个主键
    //AUTOINCREMENT 自增，添加完该字段，系统会自己创建一个数据库 sqlite_sequence,用来保存自增的值。
    // not null 不能为空，为空会报SQL错误
    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS student(stu_id integer PRIMARY KEY AUTOINCREMENT, name text)";
   int reslut =  sqlite3_exec(dbPoint, createSQL.UTF8String, NULL, NULL, NULL);
    return [self isOperationResult:reslut alertText:@"创建表"];
}

- (BOOL)insertStu:(Student *)stu {
    // 自增字段 autoincrement
    // 默认如果填入null ,值会从一开始
    NSString *insertSQL = [NSString stringWithFormat:@"insert into student (name) values('%@')",stu.name];
  int reslut =  sqlite3_exec(dbPoint, insertSQL.UTF8String, NULL, NULL, NULL);
    return [self isOperationResult:reslut alertText:@"插入数据"];
}



-(BOOL)deleteStu:(NSInteger)stu_id {
    NSString *deleteSQL = [NSString stringWithFormat:@"delete from student where stu_id =' %ld'",stu_id];
    int reslut = sqlite3_exec(dbPoint,deleteSQL.UTF8String , NULL, NULL, NULL);
    return [self isOperationResult:reslut alertText:@"删除数据"];
}
-(BOOL)deleteAll {
    NSString *deleteSQL = [NSString stringWithFormat:@"delete from student where 1=1"];
    int reslut = sqlite3_exec(dbPoint,deleteSQL.UTF8String , NULL, NULL, NULL);
    return [self isOperationResult:reslut alertText:@"删除全部数据"];

}
- (BOOL)updateStudent:(Student *)stu forId:(NSInteger)stu_id {
    NSString *updataSQL = [NSString stringWithFormat:@"UPDATE student SET name = '%@' WHERE stu_id = '%ld'", stu.name,stu_id];
    
    int result = sqlite3_exec(dbPoint, updataSQL.UTF8String, NULL, NULL, nil);
    return [self isOperationResult:result alertText:@"更新数据"];
    
}
- (NSArray *)slecteAll {
    // select 字段，字段名。。。from 表名 where 条件
    NSMutableArray *marr = [NSMutableArray array];
    NSString *selectAllSQL = @"select * from student";
    sqlite3_stmt *stmt = nil;
    // 参数1：数据库指针
    //参数2：SQL语句
    // 参数3：SQL语句的长度，-1
    // 参数4：替身 查询出的内容放入替身中，并将替身返回
    // 如果查询语句结果为成功
  int result =  sqlite3_prepare(dbPoint, selectAllSQL.UTF8String, -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            // 循环遍历替身内容
            // step查询替身中有木有其他数据
            // 当包含其他数据时，结果为SQLITE_ROW
            //当不包含其他数据时 结果为SWLITE_DONE
            // 循环体中，取出每一列的数据
            // 如果查询条件匹配. 通过sqlite3_column_函数簇 取出值.
            const unsigned char *name = sqlite3_column_text(stmt, 1);
            // 创建student 对象
            Student *stu = [[Student alloc]init];
            stu.name = [NSString stringWithUTF8String:(const char *)name];
            [marr addObject:stu];
        }
        
    }
    // 循环结束处理完数据，销毁数据
    sqlite3_finalize(stmt);
    
    
    return marr;
}
- (BOOL)isOperationResult:(int)result alertText:(NSString *)text {
    BOOL isOperation = YES;
    if (result == SQLITE_OK) {
        NSLog(@"%@成功",text);
        isOperation = YES;
    }else {
        NSLog(@"%@失败 ,code:%d",text,result);
        isOperation =NO;
    }
    return isOperation;
    

}

@end
